/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package logica.jpaControllers;

import Entidades.Producto;
import java.util.List;
import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.Persistence;
import javax.persistence.Query;
import javax.persistence.EntityNotFoundException;
import Entidades.Clasificacionproducto;
import Entidades.Detalleremito;
import java.util.ArrayList;
import java.util.Collection;
import Entidades.Stockproducto;
import Entidades.Proveedorproducto;
import Entidades.Detallecontrato;
import Entidades.Condicion;
import Entidades.Lagar;
import Entidades.Detallerecepcion;
import logica.jpaControllers.exceptions.IllegalOrphanException;
import logica.jpaControllers.exceptions.NonexistentEntityException;

/**
 *
 * @author Anali
 */
public class ProductoJpaController {

    public ProductoJpaController() {
        emf = Persistence.createEntityManagerFactory("GestorPesajeJpaPU2");
    }
    private EntityManagerFactory emf = null;

    public EntityManager getEntityManager() {
        return emf.createEntityManager();
    }

    public void create(Producto producto) {
        if (producto.getDetalleremitoCollection() == null) {
            producto.setDetalleremitoCollection(new ArrayList<Detalleremito>());
        }
        if (producto.getStockproductoCollection() == null) {
            producto.setStockproductoCollection(new ArrayList<Stockproducto>());
        }
        if (producto.getProveedorproductoCollection() == null) {
            producto.setProveedorproductoCollection(new ArrayList<Proveedorproducto>());
        }
        if (producto.getDetallecontratoCollection() == null) {
            producto.setDetallecontratoCollection(new ArrayList<Detallecontrato>());
        }
        if (producto.getCondicionCollection() == null) {
            producto.setCondicionCollection(new ArrayList<Condicion>());
        }
        if (producto.getLagarCollection() == null) {
            producto.setLagarCollection(new ArrayList<Lagar>());
        }
        if (producto.getDetallerecepcionCollection() == null) {
            producto.setDetallerecepcionCollection(new ArrayList<Detallerecepcion>());
        }
        EntityManager em = null;
        try {
            em = getEntityManager();
            em.getTransaction().begin();
            Clasificacionproducto clasificacionproducto = producto.getClasificacionproducto();
            if (clasificacionproducto != null) {
                clasificacionproducto = em.getReference(clasificacionproducto.getClass(), clasificacionproducto.getIdclasificcaionproducto());
                producto.setClasificacionproducto(clasificacionproducto);
            }
            Collection<Detalleremito> attachedDetalleremitoCollection = new ArrayList<Detalleremito>();
            for (Detalleremito detalleremitoCollectionDetalleremitoToAttach : producto.getDetalleremitoCollection()) {
                detalleremitoCollectionDetalleremitoToAttach = em.getReference(detalleremitoCollectionDetalleremitoToAttach.getClass(), detalleremitoCollectionDetalleremitoToAttach.getIdDetalleRemito());
                attachedDetalleremitoCollection.add(detalleremitoCollectionDetalleremitoToAttach);
            }
            producto.setDetalleremitoCollection(attachedDetalleremitoCollection);
            Collection<Stockproducto> attachedStockproductoCollection = new ArrayList<Stockproducto>();
            for (Stockproducto stockproductoCollectionStockproductoToAttach : producto.getStockproductoCollection()) {
                stockproductoCollectionStockproductoToAttach = em.getReference(stockproductoCollectionStockproductoToAttach.getClass(), stockproductoCollectionStockproductoToAttach.getIdStock());
                attachedStockproductoCollection.add(stockproductoCollectionStockproductoToAttach);
            }
            producto.setStockproductoCollection(attachedStockproductoCollection);
            Collection<Proveedorproducto> attachedProveedorproductoCollection = new ArrayList<Proveedorproducto>();
            for (Proveedorproducto proveedorproductoCollectionProveedorproductoToAttach : producto.getProveedorproductoCollection()) {
                proveedorproductoCollectionProveedorproductoToAttach = em.getReference(proveedorproductoCollectionProveedorproductoToAttach.getClass(), proveedorproductoCollectionProveedorproductoToAttach.getIdproveedorproducto());
                attachedProveedorproductoCollection.add(proveedorproductoCollectionProveedorproductoToAttach);
            }
            producto.setProveedorproductoCollection(attachedProveedorproductoCollection);
            Collection<Detallecontrato> attachedDetallecontratoCollection = new ArrayList<Detallecontrato>();
            for (Detallecontrato detallecontratoCollectionDetallecontratoToAttach : producto.getDetallecontratoCollection()) {
                detallecontratoCollectionDetallecontratoToAttach = em.getReference(detallecontratoCollectionDetallecontratoToAttach.getClass(), detallecontratoCollectionDetallecontratoToAttach.getIdDetalleContrato());
                attachedDetallecontratoCollection.add(detallecontratoCollectionDetallecontratoToAttach);
            }
            producto.setDetallecontratoCollection(attachedDetallecontratoCollection);
            Collection<Condicion> attachedCondicionCollection = new ArrayList<Condicion>();
            for (Condicion condicionCollectionCondicionToAttach : producto.getCondicionCollection()) {
                condicionCollectionCondicionToAttach = em.getReference(condicionCollectionCondicionToAttach.getClass(), condicionCollectionCondicionToAttach.getIdCondicion());
                attachedCondicionCollection.add(condicionCollectionCondicionToAttach);
            }
            producto.setCondicionCollection(attachedCondicionCollection);
            Collection<Lagar> attachedLagarCollection = new ArrayList<Lagar>();
            for (Lagar lagarCollectionLagarToAttach : producto.getLagarCollection()) {
                lagarCollectionLagarToAttach = em.getReference(lagarCollectionLagarToAttach.getClass(), lagarCollectionLagarToAttach.getIdLagar());
                attachedLagarCollection.add(lagarCollectionLagarToAttach);
            }
            producto.setLagarCollection(attachedLagarCollection);
            Collection<Detallerecepcion> attachedDetallerecepcionCollection = new ArrayList<Detallerecepcion>();
            for (Detallerecepcion detallerecepcionCollectionDetallerecepcionToAttach : producto.getDetallerecepcionCollection()) {
                detallerecepcionCollectionDetallerecepcionToAttach = em.getReference(detallerecepcionCollectionDetallerecepcionToAttach.getClass(), detallerecepcionCollectionDetallerecepcionToAttach.getIdDetalleRecepcion());
                attachedDetallerecepcionCollection.add(detallerecepcionCollectionDetallerecepcionToAttach);
            }
            producto.setDetallerecepcionCollection(attachedDetallerecepcionCollection);
            em.persist(producto);
            if (clasificacionproducto != null) {
                clasificacionproducto.getProductoCollection().add(producto);
                clasificacionproducto = em.merge(clasificacionproducto);
            }
            for (Detalleremito detalleremitoCollectionDetalleremito : producto.getDetalleremitoCollection()) {
                Producto oldProductoOfDetalleremitoCollectionDetalleremito = detalleremitoCollectionDetalleremito.getProducto();
                detalleremitoCollectionDetalleremito.setProducto(producto);
                detalleremitoCollectionDetalleremito = em.merge(detalleremitoCollectionDetalleremito);
                if (oldProductoOfDetalleremitoCollectionDetalleremito != null) {
                    oldProductoOfDetalleremitoCollectionDetalleremito.getDetalleremitoCollection().remove(detalleremitoCollectionDetalleremito);
                    oldProductoOfDetalleremitoCollectionDetalleremito = em.merge(oldProductoOfDetalleremitoCollectionDetalleremito);
                }
            }
            for (Stockproducto stockproductoCollectionStockproducto : producto.getStockproductoCollection()) {
                Producto oldProductoOfStockproductoCollectionStockproducto = stockproductoCollectionStockproducto.getProducto();
                stockproductoCollectionStockproducto.setProducto(producto);
                stockproductoCollectionStockproducto = em.merge(stockproductoCollectionStockproducto);
                if (oldProductoOfStockproductoCollectionStockproducto != null) {
                    oldProductoOfStockproductoCollectionStockproducto.getStockproductoCollection().remove(stockproductoCollectionStockproducto);
                    oldProductoOfStockproductoCollectionStockproducto = em.merge(oldProductoOfStockproductoCollectionStockproducto);
                }
            }
            for (Proveedorproducto proveedorproductoCollectionProveedorproducto : producto.getProveedorproductoCollection()) {
                Producto oldProductoOfProveedorproductoCollectionProveedorproducto = proveedorproductoCollectionProveedorproducto.getProducto();
                proveedorproductoCollectionProveedorproducto.setProducto(producto);
                proveedorproductoCollectionProveedorproducto = em.merge(proveedorproductoCollectionProveedorproducto);
                if (oldProductoOfProveedorproductoCollectionProveedorproducto != null) {
                    oldProductoOfProveedorproductoCollectionProveedorproducto.getProveedorproductoCollection().remove(proveedorproductoCollectionProveedorproducto);
                    oldProductoOfProveedorproductoCollectionProveedorproducto = em.merge(oldProductoOfProveedorproductoCollectionProveedorproducto);
                }
            }
            for (Detallecontrato detallecontratoCollectionDetallecontrato : producto.getDetallecontratoCollection()) {
                Producto oldProductoOfDetallecontratoCollectionDetallecontrato = detallecontratoCollectionDetallecontrato.getProducto();
                detallecontratoCollectionDetallecontrato.setProducto(producto);
                detallecontratoCollectionDetallecontrato = em.merge(detallecontratoCollectionDetallecontrato);
                if (oldProductoOfDetallecontratoCollectionDetallecontrato != null) {
                    oldProductoOfDetallecontratoCollectionDetallecontrato.getDetallecontratoCollection().remove(detallecontratoCollectionDetallecontrato);
                    oldProductoOfDetallecontratoCollectionDetallecontrato = em.merge(oldProductoOfDetallecontratoCollectionDetallecontrato);
                }
            }
            for (Condicion condicionCollectionCondicion : producto.getCondicionCollection()) {
                Producto oldProductoOfCondicionCollectionCondicion = condicionCollectionCondicion.getProducto();
                condicionCollectionCondicion.setProducto(producto);
                condicionCollectionCondicion = em.merge(condicionCollectionCondicion);
                if (oldProductoOfCondicionCollectionCondicion != null) {
                    oldProductoOfCondicionCollectionCondicion.getCondicionCollection().remove(condicionCollectionCondicion);
                    oldProductoOfCondicionCollectionCondicion = em.merge(oldProductoOfCondicionCollectionCondicion);
                }
            }
            for (Lagar lagarCollectionLagar : producto.getLagarCollection()) {
                Producto oldProductoOfLagarCollectionLagar = lagarCollectionLagar.getProducto();
                lagarCollectionLagar.setProducto(producto);
                lagarCollectionLagar = em.merge(lagarCollectionLagar);
                if (oldProductoOfLagarCollectionLagar != null) {
                    oldProductoOfLagarCollectionLagar.getLagarCollection().remove(lagarCollectionLagar);
                    oldProductoOfLagarCollectionLagar = em.merge(oldProductoOfLagarCollectionLagar);
                }
            }
            for (Detallerecepcion detallerecepcionCollectionDetallerecepcion : producto.getDetallerecepcionCollection()) {
                Producto oldProductoOfDetallerecepcionCollectionDetallerecepcion = detallerecepcionCollectionDetallerecepcion.getProducto();
                detallerecepcionCollectionDetallerecepcion.setProducto(producto);
                detallerecepcionCollectionDetallerecepcion = em.merge(detallerecepcionCollectionDetallerecepcion);
                if (oldProductoOfDetallerecepcionCollectionDetallerecepcion != null) {
                    oldProductoOfDetallerecepcionCollectionDetallerecepcion.getDetallerecepcionCollection().remove(detallerecepcionCollectionDetallerecepcion);
                    oldProductoOfDetallerecepcionCollectionDetallerecepcion = em.merge(oldProductoOfDetallerecepcionCollectionDetallerecepcion);
                }
            }
            em.getTransaction().commit();
        } finally {
            if (em != null) {
                em.close();
            }
        }
    }

    public void edit(Producto producto) throws IllegalOrphanException, NonexistentEntityException, Exception {
        EntityManager em = null;
        try {
            em = getEntityManager();
            em.getTransaction().begin();
            Producto persistentProducto = em.find(Producto.class, producto.getIdProducto());
            Clasificacionproducto clasificacionproductoOld = persistentProducto.getClasificacionproducto();
            Clasificacionproducto clasificacionproductoNew = producto.getClasificacionproducto();
            Collection<Detalleremito> detalleremitoCollectionOld = persistentProducto.getDetalleremitoCollection();
            Collection<Detalleremito> detalleremitoCollectionNew = producto.getDetalleremitoCollection();
            Collection<Stockproducto> stockproductoCollectionOld = persistentProducto.getStockproductoCollection();
            Collection<Stockproducto> stockproductoCollectionNew = producto.getStockproductoCollection();
            Collection<Proveedorproducto> proveedorproductoCollectionOld = persistentProducto.getProveedorproductoCollection();
            Collection<Proveedorproducto> proveedorproductoCollectionNew = producto.getProveedorproductoCollection();
            Collection<Detallecontrato> detallecontratoCollectionOld = persistentProducto.getDetallecontratoCollection();
            Collection<Detallecontrato> detallecontratoCollectionNew = producto.getDetallecontratoCollection();
            Collection<Condicion> condicionCollectionOld = persistentProducto.getCondicionCollection();
            Collection<Condicion> condicionCollectionNew = producto.getCondicionCollection();
            Collection<Lagar> lagarCollectionOld = persistentProducto.getLagarCollection();
            Collection<Lagar> lagarCollectionNew = producto.getLagarCollection();
            Collection<Detallerecepcion> detallerecepcionCollectionOld = persistentProducto.getDetallerecepcionCollection();
            Collection<Detallerecepcion> detallerecepcionCollectionNew = producto.getDetallerecepcionCollection();
            List<String> illegalOrphanMessages = null;
            for (Detalleremito detalleremitoCollectionOldDetalleremito : detalleremitoCollectionOld) {
                if (!detalleremitoCollectionNew.contains(detalleremitoCollectionOldDetalleremito)) {
                    if (illegalOrphanMessages == null) {
                        illegalOrphanMessages = new ArrayList<String>();
                    }
                    illegalOrphanMessages.add("You must retain Detalleremito " + detalleremitoCollectionOldDetalleremito + " since its producto field is not nullable.");
                }
            }
            for (Stockproducto stockproductoCollectionOldStockproducto : stockproductoCollectionOld) {
                if (!stockproductoCollectionNew.contains(stockproductoCollectionOldStockproducto)) {
                    if (illegalOrphanMessages == null) {
                        illegalOrphanMessages = new ArrayList<String>();
                    }
                    illegalOrphanMessages.add("You must retain Stockproducto " + stockproductoCollectionOldStockproducto + " since its producto field is not nullable.");
                }
            }
            for (Proveedorproducto proveedorproductoCollectionOldProveedorproducto : proveedorproductoCollectionOld) {
                if (!proveedorproductoCollectionNew.contains(proveedorproductoCollectionOldProveedorproducto)) {
                    if (illegalOrphanMessages == null) {
                        illegalOrphanMessages = new ArrayList<String>();
                    }
                    illegalOrphanMessages.add("You must retain Proveedorproducto " + proveedorproductoCollectionOldProveedorproducto + " since its producto field is not nullable.");
                }
            }
            for (Detallecontrato detallecontratoCollectionOldDetallecontrato : detallecontratoCollectionOld) {
                if (!detallecontratoCollectionNew.contains(detallecontratoCollectionOldDetallecontrato)) {
                    if (illegalOrphanMessages == null) {
                        illegalOrphanMessages = new ArrayList<String>();
                    }
                    illegalOrphanMessages.add("You must retain Detallecontrato " + detallecontratoCollectionOldDetallecontrato + " since its producto field is not nullable.");
                }
            }
            for (Condicion condicionCollectionOldCondicion : condicionCollectionOld) {
                if (!condicionCollectionNew.contains(condicionCollectionOldCondicion)) {
                    if (illegalOrphanMessages == null) {
                        illegalOrphanMessages = new ArrayList<String>();
                    }
                    illegalOrphanMessages.add("You must retain Condicion " + condicionCollectionOldCondicion + " since its producto field is not nullable.");
                }
            }
            for (Lagar lagarCollectionOldLagar : lagarCollectionOld) {
                if (!lagarCollectionNew.contains(lagarCollectionOldLagar)) {
                    if (illegalOrphanMessages == null) {
                        illegalOrphanMessages = new ArrayList<String>();
                    }
                    illegalOrphanMessages.add("You must retain Lagar " + lagarCollectionOldLagar + " since its producto field is not nullable.");
                }
            }
            for (Detallerecepcion detallerecepcionCollectionOldDetallerecepcion : detallerecepcionCollectionOld) {
                if (!detallerecepcionCollectionNew.contains(detallerecepcionCollectionOldDetallerecepcion)) {
                    if (illegalOrphanMessages == null) {
                        illegalOrphanMessages = new ArrayList<String>();
                    }
                    illegalOrphanMessages.add("You must retain Detallerecepcion " + detallerecepcionCollectionOldDetallerecepcion + " since its producto field is not nullable.");
                }
            }
            if (illegalOrphanMessages != null) {
                throw new IllegalOrphanException(illegalOrphanMessages);
            }
            if (clasificacionproductoNew != null) {
                clasificacionproductoNew = em.getReference(clasificacionproductoNew.getClass(), clasificacionproductoNew.getIdclasificcaionproducto());
                producto.setClasificacionproducto(clasificacionproductoNew);
            }
            Collection<Detalleremito> attachedDetalleremitoCollectionNew = new ArrayList<Detalleremito>();
            for (Detalleremito detalleremitoCollectionNewDetalleremitoToAttach : detalleremitoCollectionNew) {
                detalleremitoCollectionNewDetalleremitoToAttach = em.getReference(detalleremitoCollectionNewDetalleremitoToAttach.getClass(), detalleremitoCollectionNewDetalleremitoToAttach.getIdDetalleRemito());
                attachedDetalleremitoCollectionNew.add(detalleremitoCollectionNewDetalleremitoToAttach);
            }
            detalleremitoCollectionNew = attachedDetalleremitoCollectionNew;
            producto.setDetalleremitoCollection(detalleremitoCollectionNew);
            Collection<Stockproducto> attachedStockproductoCollectionNew = new ArrayList<Stockproducto>();
            for (Stockproducto stockproductoCollectionNewStockproductoToAttach : stockproductoCollectionNew) {
                stockproductoCollectionNewStockproductoToAttach = em.getReference(stockproductoCollectionNewStockproductoToAttach.getClass(), stockproductoCollectionNewStockproductoToAttach.getIdStock());
                attachedStockproductoCollectionNew.add(stockproductoCollectionNewStockproductoToAttach);
            }
            stockproductoCollectionNew = attachedStockproductoCollectionNew;
            producto.setStockproductoCollection(stockproductoCollectionNew);
            Collection<Proveedorproducto> attachedProveedorproductoCollectionNew = new ArrayList<Proveedorproducto>();
            for (Proveedorproducto proveedorproductoCollectionNewProveedorproductoToAttach : proveedorproductoCollectionNew) {
                proveedorproductoCollectionNewProveedorproductoToAttach = em.getReference(proveedorproductoCollectionNewProveedorproductoToAttach.getClass(), proveedorproductoCollectionNewProveedorproductoToAttach.getIdproveedorproducto());
                attachedProveedorproductoCollectionNew.add(proveedorproductoCollectionNewProveedorproductoToAttach);
            }
            proveedorproductoCollectionNew = attachedProveedorproductoCollectionNew;
            producto.setProveedorproductoCollection(proveedorproductoCollectionNew);
            Collection<Detallecontrato> attachedDetallecontratoCollectionNew = new ArrayList<Detallecontrato>();
            for (Detallecontrato detallecontratoCollectionNewDetallecontratoToAttach : detallecontratoCollectionNew) {
                detallecontratoCollectionNewDetallecontratoToAttach = em.getReference(detallecontratoCollectionNewDetallecontratoToAttach.getClass(), detallecontratoCollectionNewDetallecontratoToAttach.getIdDetalleContrato());
                attachedDetallecontratoCollectionNew.add(detallecontratoCollectionNewDetallecontratoToAttach);
            }
            detallecontratoCollectionNew = attachedDetallecontratoCollectionNew;
            producto.setDetallecontratoCollection(detallecontratoCollectionNew);
            Collection<Condicion> attachedCondicionCollectionNew = new ArrayList<Condicion>();
            for (Condicion condicionCollectionNewCondicionToAttach : condicionCollectionNew) {
                condicionCollectionNewCondicionToAttach = em.getReference(condicionCollectionNewCondicionToAttach.getClass(), condicionCollectionNewCondicionToAttach.getIdCondicion());
                attachedCondicionCollectionNew.add(condicionCollectionNewCondicionToAttach);
            }
            condicionCollectionNew = attachedCondicionCollectionNew;
            producto.setCondicionCollection(condicionCollectionNew);
            Collection<Lagar> attachedLagarCollectionNew = new ArrayList<Lagar>();
            for (Lagar lagarCollectionNewLagarToAttach : lagarCollectionNew) {
                lagarCollectionNewLagarToAttach = em.getReference(lagarCollectionNewLagarToAttach.getClass(), lagarCollectionNewLagarToAttach.getIdLagar());
                attachedLagarCollectionNew.add(lagarCollectionNewLagarToAttach);
            }
            lagarCollectionNew = attachedLagarCollectionNew;
            producto.setLagarCollection(lagarCollectionNew);
            Collection<Detallerecepcion> attachedDetallerecepcionCollectionNew = new ArrayList<Detallerecepcion>();
            for (Detallerecepcion detallerecepcionCollectionNewDetallerecepcionToAttach : detallerecepcionCollectionNew) {
                detallerecepcionCollectionNewDetallerecepcionToAttach = em.getReference(detallerecepcionCollectionNewDetallerecepcionToAttach.getClass(), detallerecepcionCollectionNewDetallerecepcionToAttach.getIdDetalleRecepcion());
                attachedDetallerecepcionCollectionNew.add(detallerecepcionCollectionNewDetallerecepcionToAttach);
            }
            detallerecepcionCollectionNew = attachedDetallerecepcionCollectionNew;
            producto.setDetallerecepcionCollection(detallerecepcionCollectionNew);
            producto = em.merge(producto);
            if (clasificacionproductoOld != null && !clasificacionproductoOld.equals(clasificacionproductoNew)) {
                clasificacionproductoOld.getProductoCollection().remove(producto);
                clasificacionproductoOld = em.merge(clasificacionproductoOld);
            }
            if (clasificacionproductoNew != null && !clasificacionproductoNew.equals(clasificacionproductoOld)) {
                clasificacionproductoNew.getProductoCollection().add(producto);
                clasificacionproductoNew = em.merge(clasificacionproductoNew);
            }
            for (Detalleremito detalleremitoCollectionNewDetalleremito : detalleremitoCollectionNew) {
                if (!detalleremitoCollectionOld.contains(detalleremitoCollectionNewDetalleremito)) {
                    Producto oldProductoOfDetalleremitoCollectionNewDetalleremito = detalleremitoCollectionNewDetalleremito.getProducto();
                    detalleremitoCollectionNewDetalleremito.setProducto(producto);
                    detalleremitoCollectionNewDetalleremito = em.merge(detalleremitoCollectionNewDetalleremito);
                    if (oldProductoOfDetalleremitoCollectionNewDetalleremito != null && !oldProductoOfDetalleremitoCollectionNewDetalleremito.equals(producto)) {
                        oldProductoOfDetalleremitoCollectionNewDetalleremito.getDetalleremitoCollection().remove(detalleremitoCollectionNewDetalleremito);
                        oldProductoOfDetalleremitoCollectionNewDetalleremito = em.merge(oldProductoOfDetalleremitoCollectionNewDetalleremito);
                    }
                }
            }
            for (Stockproducto stockproductoCollectionNewStockproducto : stockproductoCollectionNew) {
                if (!stockproductoCollectionOld.contains(stockproductoCollectionNewStockproducto)) {
                    Producto oldProductoOfStockproductoCollectionNewStockproducto = stockproductoCollectionNewStockproducto.getProducto();
                    stockproductoCollectionNewStockproducto.setProducto(producto);
                    stockproductoCollectionNewStockproducto = em.merge(stockproductoCollectionNewStockproducto);
                    if (oldProductoOfStockproductoCollectionNewStockproducto != null && !oldProductoOfStockproductoCollectionNewStockproducto.equals(producto)) {
                        oldProductoOfStockproductoCollectionNewStockproducto.getStockproductoCollection().remove(stockproductoCollectionNewStockproducto);
                        oldProductoOfStockproductoCollectionNewStockproducto = em.merge(oldProductoOfStockproductoCollectionNewStockproducto);
                    }
                }
            }
            for (Proveedorproducto proveedorproductoCollectionNewProveedorproducto : proveedorproductoCollectionNew) {
                if (!proveedorproductoCollectionOld.contains(proveedorproductoCollectionNewProveedorproducto)) {
                    Producto oldProductoOfProveedorproductoCollectionNewProveedorproducto = proveedorproductoCollectionNewProveedorproducto.getProducto();
                    proveedorproductoCollectionNewProveedorproducto.setProducto(producto);
                    proveedorproductoCollectionNewProveedorproducto = em.merge(proveedorproductoCollectionNewProveedorproducto);
                    if (oldProductoOfProveedorproductoCollectionNewProveedorproducto != null && !oldProductoOfProveedorproductoCollectionNewProveedorproducto.equals(producto)) {
                        oldProductoOfProveedorproductoCollectionNewProveedorproducto.getProveedorproductoCollection().remove(proveedorproductoCollectionNewProveedorproducto);
                        oldProductoOfProveedorproductoCollectionNewProveedorproducto = em.merge(oldProductoOfProveedorproductoCollectionNewProveedorproducto);
                    }
                }
            }
            for (Detallecontrato detallecontratoCollectionNewDetallecontrato : detallecontratoCollectionNew) {
                if (!detallecontratoCollectionOld.contains(detallecontratoCollectionNewDetallecontrato)) {
                    Producto oldProductoOfDetallecontratoCollectionNewDetallecontrato = detallecontratoCollectionNewDetallecontrato.getProducto();
                    detallecontratoCollectionNewDetallecontrato.setProducto(producto);
                    detallecontratoCollectionNewDetallecontrato = em.merge(detallecontratoCollectionNewDetallecontrato);
                    if (oldProductoOfDetallecontratoCollectionNewDetallecontrato != null && !oldProductoOfDetallecontratoCollectionNewDetallecontrato.equals(producto)) {
                        oldProductoOfDetallecontratoCollectionNewDetallecontrato.getDetallecontratoCollection().remove(detallecontratoCollectionNewDetallecontrato);
                        oldProductoOfDetallecontratoCollectionNewDetallecontrato = em.merge(oldProductoOfDetallecontratoCollectionNewDetallecontrato);
                    }
                }
            }
            for (Condicion condicionCollectionNewCondicion : condicionCollectionNew) {
                if (!condicionCollectionOld.contains(condicionCollectionNewCondicion)) {
                    Producto oldProductoOfCondicionCollectionNewCondicion = condicionCollectionNewCondicion.getProducto();
                    condicionCollectionNewCondicion.setProducto(producto);
                    condicionCollectionNewCondicion = em.merge(condicionCollectionNewCondicion);
                    if (oldProductoOfCondicionCollectionNewCondicion != null && !oldProductoOfCondicionCollectionNewCondicion.equals(producto)) {
                        oldProductoOfCondicionCollectionNewCondicion.getCondicionCollection().remove(condicionCollectionNewCondicion);
                        oldProductoOfCondicionCollectionNewCondicion = em.merge(oldProductoOfCondicionCollectionNewCondicion);
                    }
                }
            }
            for (Lagar lagarCollectionNewLagar : lagarCollectionNew) {
                if (!lagarCollectionOld.contains(lagarCollectionNewLagar)) {
                    Producto oldProductoOfLagarCollectionNewLagar = lagarCollectionNewLagar.getProducto();
                    lagarCollectionNewLagar.setProducto(producto);
                    lagarCollectionNewLagar = em.merge(lagarCollectionNewLagar);
                    if (oldProductoOfLagarCollectionNewLagar != null && !oldProductoOfLagarCollectionNewLagar.equals(producto)) {
                        oldProductoOfLagarCollectionNewLagar.getLagarCollection().remove(lagarCollectionNewLagar);
                        oldProductoOfLagarCollectionNewLagar = em.merge(oldProductoOfLagarCollectionNewLagar);
                    }
                }
            }
            for (Detallerecepcion detallerecepcionCollectionNewDetallerecepcion : detallerecepcionCollectionNew) {
                if (!detallerecepcionCollectionOld.contains(detallerecepcionCollectionNewDetallerecepcion)) {
                    Producto oldProductoOfDetallerecepcionCollectionNewDetallerecepcion = detallerecepcionCollectionNewDetallerecepcion.getProducto();
                    detallerecepcionCollectionNewDetallerecepcion.setProducto(producto);
                    detallerecepcionCollectionNewDetallerecepcion = em.merge(detallerecepcionCollectionNewDetallerecepcion);
                    if (oldProductoOfDetallerecepcionCollectionNewDetallerecepcion != null && !oldProductoOfDetallerecepcionCollectionNewDetallerecepcion.equals(producto)) {
                        oldProductoOfDetallerecepcionCollectionNewDetallerecepcion.getDetallerecepcionCollection().remove(detallerecepcionCollectionNewDetallerecepcion);
                        oldProductoOfDetallerecepcionCollectionNewDetallerecepcion = em.merge(oldProductoOfDetallerecepcionCollectionNewDetallerecepcion);
                    }
                }
            }
            em.getTransaction().commit();
        } catch (Exception ex) {
            String msg = ex.getLocalizedMessage();
            if (msg == null || msg.length() == 0) {
                Integer id = producto.getIdProducto();
                if (findProducto(id) == null) {
                    throw new NonexistentEntityException("The producto with id " + id + " no longer exists.");
                }
            }
            throw ex;
        } finally {
            if (em != null) {
                em.close();
            }
        }
    }

    public void destroy(Integer id) throws IllegalOrphanException, NonexistentEntityException {
        EntityManager em = null;
        try {
            em = getEntityManager();
            em.getTransaction().begin();
            Producto producto;
            try {
                producto = em.getReference(Producto.class, id);
                producto.getIdProducto();
            } catch (EntityNotFoundException enfe) {
                throw new NonexistentEntityException("The producto with id " + id + " no longer exists.", enfe);
            }
            List<String> illegalOrphanMessages = null;
            Collection<Detalleremito> detalleremitoCollectionOrphanCheck = producto.getDetalleremitoCollection();
            for (Detalleremito detalleremitoCollectionOrphanCheckDetalleremito : detalleremitoCollectionOrphanCheck) {
                if (illegalOrphanMessages == null) {
                    illegalOrphanMessages = new ArrayList<String>();
                }
                illegalOrphanMessages.add("This Producto (" + producto + ") cannot be destroyed since the Detalleremito " + detalleremitoCollectionOrphanCheckDetalleremito + " in its detalleremitoCollection field has a non-nullable producto field.");
            }
            Collection<Stockproducto> stockproductoCollectionOrphanCheck = producto.getStockproductoCollection();
            for (Stockproducto stockproductoCollectionOrphanCheckStockproducto : stockproductoCollectionOrphanCheck) {
                if (illegalOrphanMessages == null) {
                    illegalOrphanMessages = new ArrayList<String>();
                }
                illegalOrphanMessages.add("This Producto (" + producto + ") cannot be destroyed since the Stockproducto " + stockproductoCollectionOrphanCheckStockproducto + " in its stockproductoCollection field has a non-nullable producto field.");
            }
            Collection<Proveedorproducto> proveedorproductoCollectionOrphanCheck = producto.getProveedorproductoCollection();
            for (Proveedorproducto proveedorproductoCollectionOrphanCheckProveedorproducto : proveedorproductoCollectionOrphanCheck) {
                if (illegalOrphanMessages == null) {
                    illegalOrphanMessages = new ArrayList<String>();
                }
                illegalOrphanMessages.add("This Producto (" + producto + ") cannot be destroyed since the Proveedorproducto " + proveedorproductoCollectionOrphanCheckProveedorproducto + " in its proveedorproductoCollection field has a non-nullable producto field.");
            }
            Collection<Detallecontrato> detallecontratoCollectionOrphanCheck = producto.getDetallecontratoCollection();
            for (Detallecontrato detallecontratoCollectionOrphanCheckDetallecontrato : detallecontratoCollectionOrphanCheck) {
                if (illegalOrphanMessages == null) {
                    illegalOrphanMessages = new ArrayList<String>();
                }
                illegalOrphanMessages.add("This Producto (" + producto + ") cannot be destroyed since the Detallecontrato " + detallecontratoCollectionOrphanCheckDetallecontrato + " in its detallecontratoCollection field has a non-nullable producto field.");
            }
            Collection<Condicion> condicionCollectionOrphanCheck = producto.getCondicionCollection();
            for (Condicion condicionCollectionOrphanCheckCondicion : condicionCollectionOrphanCheck) {
                if (illegalOrphanMessages == null) {
                    illegalOrphanMessages = new ArrayList<String>();
                }
                illegalOrphanMessages.add("This Producto (" + producto + ") cannot be destroyed since the Condicion " + condicionCollectionOrphanCheckCondicion + " in its condicionCollection field has a non-nullable producto field.");
            }
            Collection<Lagar> lagarCollectionOrphanCheck = producto.getLagarCollection();
            for (Lagar lagarCollectionOrphanCheckLagar : lagarCollectionOrphanCheck) {
                if (illegalOrphanMessages == null) {
                    illegalOrphanMessages = new ArrayList<String>();
                }
                illegalOrphanMessages.add("This Producto (" + producto + ") cannot be destroyed since the Lagar " + lagarCollectionOrphanCheckLagar + " in its lagarCollection field has a non-nullable producto field.");
            }
            Collection<Detallerecepcion> detallerecepcionCollectionOrphanCheck = producto.getDetallerecepcionCollection();
            for (Detallerecepcion detallerecepcionCollectionOrphanCheckDetallerecepcion : detallerecepcionCollectionOrphanCheck) {
                if (illegalOrphanMessages == null) {
                    illegalOrphanMessages = new ArrayList<String>();
                }
                illegalOrphanMessages.add("This Producto (" + producto + ") cannot be destroyed since the Detallerecepcion " + detallerecepcionCollectionOrphanCheckDetallerecepcion + " in its detallerecepcionCollection field has a non-nullable producto field.");
            }
            if (illegalOrphanMessages != null) {
                throw new IllegalOrphanException(illegalOrphanMessages);
            }
            Clasificacionproducto clasificacionproducto = producto.getClasificacionproducto();
            if (clasificacionproducto != null) {
                clasificacionproducto.getProductoCollection().remove(producto);
                clasificacionproducto = em.merge(clasificacionproducto);
            }
            em.remove(producto);
            em.getTransaction().commit();
        } finally {
            if (em != null) {
                em.close();
            }
        }
    }

    public List<Producto> findProductoEntities() {
        return findProductoEntities(true, -1, -1);
    }

    public List<Producto> findProductoEntities(int maxResults, int firstResult) {
        return findProductoEntities(false, maxResults, firstResult);
    }

    private List<Producto> findProductoEntities(boolean all, int maxResults, int firstResult) {
        EntityManager em = getEntityManager();
        try {
            Query q = em.createQuery("select object(o) from Producto as o");
            if (!all) {
                q.setMaxResults(maxResults);
                q.setFirstResult(firstResult);
            }
            return q.getResultList();
        } finally {
            em.close();
        }
    }

    public Producto findProducto(Integer id) {
        EntityManager em = getEntityManager();
        try {
            return em.find(Producto.class, id);
        } finally {
            em.close();
        }
    }

    public int getProductoCount() {
        EntityManager em = getEntityManager();
        try {
            Query q = em.createQuery("select count(o) from Producto as o");
            return ((Long) q.getSingleResult()).intValue();
        } finally {
            em.close();
        }
    }
     public Producto findProducto_x_nombre(String nom) {
         EntityManager em = getEntityManager();
        try {
            Query q = em.createQuery("select u from Producto u where u.nombreProducto = " + "'" + nom +"'");
            return (Producto) q.getSingleResult();
        } finally {
            em.close();
        }
    }

    public List<Producto> findXVariedadClasificacion(String variedad, String clasificacionproducto) {
         EntityManager em = getEntityManager();
        try {
            Query q = em.createNamedQuery("Producto.findByVariedadClasificacion");
            q.setParameter(clasificacionproducto, "clasificacionproducto");
            return q.getResultList();
        } finally {
            em.close();
        }

    }

}
